﻿using ControleEstoque.Entidades.ControleAtivoDataSetTableAdapters;
using System.Configuration;
using System;
using System.Data;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Xml;
using System.Data.SqlClient;
namespace ControleEstoque.Entidades.ControleAtivoDataSetTableAdapters
{
	public partial class CampoAtivoTableAdapter
	{
		[global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
		[global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Update, true)]
		public virtual int Update(string CommandName, string CampoAtivoValor, int Original_CampoId, int Original_AtivoId)
		{
			switch (CommandName)
			{
				case "Insert":
					if (!string.IsNullOrEmpty(CampoAtivoValor))
					{
						return this.Insert(Original_CampoId, Original_AtivoId, CampoAtivoValor);
					}
					else
					{
						return 0;
					}
				case "Update":
					if (string.IsNullOrEmpty(CampoAtivoValor))
					{
						return this.Delete(Original_CampoId, Original_AtivoId);
					}
					else
					{
						return this.Update(Original_CampoId, Original_AtivoId, CampoAtivoValor, Original_CampoId, Original_AtivoId);
					}
				default:
					return 0;
			}
		}
	}

	partial class MovimentacaoTableAdapter
	{
		[global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
		[global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Select, true)]
		public virtual ControleAtivoDataSet.MovimentacaoDataTable GetDataFromPortalLeitor(int portalLeitorId, byte antena, string movimentacaoTipo)
		{
			ControleEstoque.Entidades.ControleAtivoDataSet.MovimentacaoDataTable toReturn = new ControleEstoque.Entidades.ControleAtivoDataSet.MovimentacaoDataTable();
			PortalLeitorTableAdapter portalLeitorAdapter = new PortalLeitorTableAdapter();
			ControleEstoque.Entidades.ControleAtivoDataSet.PortalLeitorDataTable portalLeitorData = portalLeitorAdapter.GetDataByPortalLeitorId(portalLeitorId);
			DateTime movimentacaoData = DateTime.Now;

			if (portalLeitorData.Count > 0)
			{
				ConfiguracaoTableAdapter configuracaoAdapter = new ConfiguracaoTableAdapter();
				ControleEstoque.Entidades.ControleAtivoDataSet.ConfiguracaoDataTable configuracaoData = configuracaoAdapter.GetDataByConfiguracaoChave("ReadCount");
				AtivoTableAdapter ativoAdapter = new AtivoTableAdapter();
				ControleEstoque.Entidades.ControleAtivoDataSet.AtivoDataTable ativoData = ativoAdapter.GetData();
				int readCount = 0;

				if (configuracaoData.Count > 0)
				{
					readCount = int.Parse(configuracaoData[0].ConfiguracaoValor);
				}
				else
				{
					readCount = int.Parse(ConfigurationSettings.AppSettings["ReadCount"]);
				}

				Reader reader = Reader.CreateReader();
				reader.Connect(portalLeitorData[0].PortalLeitorIP, int.Parse(portalLeitorData[0].PortalLeitorTCP));

				string[] dataRead = reader.Read(readCount, antena);
				string biggestBox = "00";
				byte biggestBoxSize = 0;

				for (int i = 0; i < dataRead.Length; i++)
				{
					byte boxSize = byte.Parse(dataRead[i].Substring(0, 2), NumberStyles.HexNumber);
					if (boxSize > biggestBoxSize)
					{
						biggestBoxSize = boxSize;
						biggestBox = dataRead[i];
					}
				}

				Dictionary<Guid, ControleAtivoDataSet.MovimentacaoRow> rows = new Dictionary<Guid, ControleAtivoDataSet.MovimentacaoRow>();

				ControleEstoque.Entidades.ControleAtivoDataSet.MovimentacaoRow biggestBoxRow = null;

				if (biggestBoxSize > 0)
				{
					List<string> listDataRead = new List<string>(dataRead);
					listDataRead.Remove(biggestBox);
					dataRead = listDataRead.ToArray();

					biggestBoxRow = toReturn.NewMovimentacaoRow();

					biggestBoxRow.EstoqueLocalizacaoTamanhoCaixa = biggestBoxSize;
					biggestBoxRow.EstoqueLocalizacaoRFID = new Guid(biggestBox.Substring(2, 32));
					biggestBoxRow.EstoqueLocalizacaoRFIDPai = Guid.Empty;
					biggestBoxRow.LocalArmazenagemId = portalLeitorData[0].LocalArmazenagemId;
					biggestBoxRow.MovimentacaoData = movimentacaoData;
					biggestBoxRow.MovimentacaoQuantidade = 1;
					biggestBoxRow.MovimentacaoTipo = movimentacaoTipo;
					biggestBoxRow.AtivoNome = "(Caixa tam. " + biggestBoxRow.EstoqueLocalizacaoTamanhoCaixa + ")";

					toReturn.AddMovimentacaoRow(biggestBoxRow);
					rows.Add(biggestBoxRow.EstoqueLocalizacaoRFID, biggestBoxRow);
				}

				for (int i = 0; i < dataRead.Length; i++)
				{
					Guid estoqueLocalizacaoRFID = new Guid(dataRead[i].Substring(2, 32));

					if (rows.ContainsKey(estoqueLocalizacaoRFID))
					{
						rows[estoqueLocalizacaoRFID].MovimentacaoQuantidade++;
					}
					else
					{
						ControleAtivoDataSet.MovimentacaoRow row = null;
						byte boxSize = byte.Parse(dataRead[i].Substring(0, 2), NumberStyles.HexNumber);
						row = toReturn.NewMovimentacaoRow();
						row.EstoqueLocalizacaoTamanhoCaixa = boxSize;
						if (row.EstoqueLocalizacaoTamanhoCaixa == 0)
						{
							ControleEstoque.Entidades.ControleAtivoDataSet.AtivoRow ativo = ativoData.FindByAtivoRFID(estoqueLocalizacaoRFID.ToString("N").Substring(0, 8));
							if (ativo != null)
							{
								row.AtivoId = ativo.AtivoId;
								row.AtivoNome = ativo.AtivoNome;
							}
							else
							{
								row.AtivoNotFound = true;
							}
							row.MovimentacaoLote = uint.Parse(dataRead[i].Substring(10, 8), NumberStyles.HexNumber).ToString();
							row.MovimentacaoDataValidade = Misc.ConverHexToDate(dataRead[i].Substring(18, 16));
						}
						else
						{
							row.AtivoNome = "(Caixa tam. " + row.EstoqueLocalizacaoTamanhoCaixa + ")";
						}

						row.EstoqueLocalizacaoRFID = estoqueLocalizacaoRFID;
						row.LocalArmazenagemId = portalLeitorData[0].LocalArmazenagemId;
						row.MovimentacaoData = movimentacaoData;
						row.MovimentacaoQuantidade = 1;
						row.MovimentacaoTipo = movimentacaoTipo;
						if (biggestBoxRow != null)
						{
							row.EstoqueLocalizacaoRFIDPai = biggestBoxRow.EstoqueLocalizacaoRFID;
							row.MovimentacaoRowParent = biggestBoxRow;
						}

						toReturn.AddMovimentacaoRow(row);
						rows.Add(estoqueLocalizacaoRFID, row);
					}
				}
			}

			return toReturn;
		}
	}
}

namespace ControleEstoque.Entidades
{
	public partial class ControleAtivoDataSet
	{
		partial class MovimentacaoDataTable
		{
		}
	
		public partial class AtivoDataTable
		{
			public AtivoRow FindByAtivoRFID(string ativoRFID)
			{
				AtivoRow toReturn = null;

				EnumerableRowCollection<AtivoRow> rows = (from row in this where row.AtivoRFID.ToLower() == ativoRFID.ToLower() select row);

				IEnumerator<AtivoRow> enumer = rows.GetEnumerator();

				if (enumer.MoveNext())
				{
					toReturn = enumer.Current;
				}

				return toReturn;
			}
		}
	}
}
